//#import <Foundation/Foundation.h>
//
//@class GCDAsyncSocket;
//@class WebSocket;
//
//#if TARGET_OS_IPHONE
//  #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 40000 // iPhone 4.0
//    #define IMPLEMENTED_PROTOCOLS <NSNetServiceDelegate>
//  #else
//    #define IMPLEMENTED_PROTOCOLS 
//  #endif
//#else
//  #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 // Mac OS X 10.6
//    #define IMPLEMENTED_PROTOCOLS <NSNetServiceDelegate>
//  #else
//    #define IMPLEMENTED_PROTOCOLS 
//  #endif
//#endif
//
//
//@interface HTTPServer : NSObject IMPLEMENTED_PROTOCOLS
//{
//	// Underlying asynchronous TCP/IP socket
//	GCDAsyncSocket *asyncSocket;
//	
//	// Dispatch queues
//	dispatch_queue_t serverQueue;
//	dispatch_queue_t connectionQueue;
//	void *IsOnServerQueueKey;
//	void *IsOnConnectionQueueKey;
//	
//	// HTTP server configuration
//	NSString *documentRoot;
//	Class connectionClass;
//	NSString *interface;
//	UInt16 port;
//	
//	// NSNetService and related variables
//	NSNetService *netService;
//	NSString *domain;
//	NSString *type;
//	NSString *name;
//	NSString *publishedName;
//	NSDictionary *txtRecordDictionary;
//	
//	// Connection management
//	NSMutableArray *connections;
//	NSMutableArray *webSockets;
//	NSLock *connectionsLock;
//	NSLock *webSocketsLock;
//	
//	BOOL isRunning;
//}
//
///**
// * Specifies the document root to serve files from.
// * For example, if you set this to "/Users/<your_username>/Sites",
// * then it will serve files out of the local Sites directory (including subdirectories).
// * 
// * The default value is nil.
// * The default server configuration will not serve any files until this is set.
// * 
// * If you change the documentRoot while the server is running,
// * the change will affect future incoming http connections.
//**/
//- (NSString *)documentRoot;
//- (void)setDocumentRoot:(NSString *)value;
//
///**
// * The connection class is the class used to handle incoming HTTP connections.
// * 
// * The default value is [HTTPConnection class].
// * You can override HTTPConnection, and then set this to [MyHTTPConnection class].
// * 
// * If you change the connectionClass while the server is running,
// * the change will affect future incoming http connections.
//**/
//- (Class)connectionClass;
//- (void)setConnectionClass:(Class)value;
//
///**
// * Set what interface you'd like the server to listen on.
// * By default this is nil, which causes the server to listen on all available interfaces like en1, wifi etc.
// * 
// * The interface may be specified by name (e.g. "en1" or "lo0") or by IP address (e.g. "192.168.4.34").
// * You may also use the special strings "localhost" or "loopback" to specify that
// * the socket only accept connections from the local machine.
//**/
//- (NSString *)interface;
//- (void)setInterface:(NSString *)value;
//
///**
// * The port number to run the HTTP server on.
// * 
// * The default port number is zero, meaning the server will automatically use any available port.
// * This is the recommended port value, as it avoids possible port conflicts with other applications.
// * Technologies such as Bonjour can be used to allow other applications to automatically discover the port number.
// * 
// * Note: As is common on most OS's, you need root privledges to bind to port numbers below 1024.
// * 
// * You can change the port property while the server is running, but it won't affect the running server.
// * To actually change the port the server is listening for connections on you'll need to restart the server.
// * 
// * The listeningPort method will always return the port number the running server is listening for connections on.
// * If the server is not running this method returns 0.
//**/
//- (UInt16)port;
//- (UInt16)listeningPort;
//- (void)setPort:(UInt16)value;
//
///**
// * Bonjour domain for publishing the service.
// * The default value is "local.".
// * 
// * Note: Bonjour publishing requires you set a type.
// * 
// * If you change the domain property after the bonjour service has already been published (server already started),
// * you'll need to invoke the republishBonjour method to update the broadcasted bonjour service.
//**/
//- (NSString *)domain;
//- (void)setDomain:(NSString *)value;
//
///**
// * Bonjour name for publishing the service.
// * The default value is "".
// * 
// * If using an empty string ("") for the service name when registering,
// * the system will automatically use the "Computer Name".
// * Using an empty string will also handle name conflicts
// * by automatically appending a digit to the end of the name.
// * 
// * Note: Bonjour publishing requires you set a type.
// * 
// * If you change the name after the bonjour service has already been published (server already started),
// * you'll need to invoke the republishBonjour method to update the broadcasted bonjour service.
// * 
// * The publishedName method will always return the actual name that was published via the bonjour service.
// * If the service is not running this method returns nil.
//**/
//- (NSString *)name;
//- (NSString *)publishedName;
//- (void)setName:(NSString *)value;
//
///**
// * Bonjour type for publishing the service.
// * The default value is nil.
// * The service will not be published via bonjour unless the type is set.
// * 
// * If you wish to publish the service as a traditional HTTP server, you should set the type to be "_http._tcp.".
// * 
// * If you change the type after the bonjour service has already been published (server already started),
// * you'll need to invoke the republishBonjour method to update the broadcasted bonjour service.
//**/
//- (NSString *)type;
//- (void)setType:(NSString *)value;
//
///**
// * Republishes the service via bonjour if the server is running.
// * If the service was not previously published, this method will publish it (if the server is running).
//**/
//- (void)republishBonjour;
//
///**
// * 
//**/
//- (NSDictionary *)TXTRecordDictionary;
//- (void)setTXTRecordDictionary:(NSDictionary *)dict;
//
///**
// * Attempts to starts the server on the configured port, interface, etc.
// * 
// * If an error occurs, this method returns NO and sets the errPtr (if given).
// * Otherwise returns YES on success.
// * 
// * Some examples of errors that might occur:
// * - You specified the server listen on a port which is already in use by another application.
// * - You specified the server listen on a port number below 1024, which requires root priviledges.
// * 
// * Code Example:
// * 
// * NSError *err = nil;
// * if (![httpServer start:&err])
// * {
// *     NSLog(@"Error starting http server: %@", err);
// * }
//**/
//- (BOOL)start:(NSError **)errPtr;
//
///**
// * Stops the server, preventing it from accepting any new connections.
// * You may specify whether or not you want to close the existing client connections.
// * 
// * The default stop method (with no arguments) will close any existing connections. (It invokes [self stop:NO])
//**/
//- (void)stop;
//- (void)stop:(BOOL)keepExistingConnections;
//
//- (BOOL)isRunning;
//
//- (void)addWebSocket:(WebSocket *)ws;
//
//- (NSUInteger)numberOfHTTPConnections;
//- (NSUInteger)numberOfWebSocketConnections;
//
//@end
